// class Animal {
//   public name
//   public constructor(name) {
//     this.name = name
//   }
// }

// let a = new Animal('Jack')
// console.log(a.name) // Jack
// a.name = 'Tom'
// console.log(a.name) // Tom

// class Animal {
//   private name
//   public constructor(name) {
//     this.name = name
//   }
// }

// let a = new Animal('Jack')
// console.log(a.name)
// a.name = 'Tom'

// class Animal {
//   private name
//   public constructor(name) {
//     this.name = name
//   }
// }

// class Cat extends Animal {
//   constructor(name) {
//     super(name)
//     console.log(this.name)
//   }
// }

// class Animal {
//   protected name
//   public constructor(name) {
//     this.name = name
//   }
// }

// class Cat extends Animal {
//   constructor(name) {
//     super(name)
//     console.log(this.name)
//   }
// }

// class Animal {
//   public name
//   private constructor(name) {
//     this.name = name
//   }
// }
// class Cat extends Animal {
//   constructor(name) {
//     super(name)
//   }
// }

// let a = new Animal('Jack')

// class Animal {

//   public constructor(public name) {
//     this.name = name
//   }
// }

// class Animal {
//   //   readonly name
//   public constructor(public readonly name) {
//     this.name = name
//   }
// }

// let a = new Animal('Jack')
// console.log(a.name) // Jack
// a.name = 'Tom'

// abstract class Animal {
//   public name
//   public constructor(name) {
//     this.name = name
//   }
//   public abstract sayHi()
// }

// let a = new Animal('Jack')

abstract class Animal {
  public name
  public constructor(name) {
    this.name = name
  }
  public abstract sayHi()
}

class Cat extends Animal {
  public eat() {
    console.log(`${this.name} is eating.`)
  }
  public sayHi() {
    console.log('嘿嘿嘿')
  }
}

let cat = new Cat('Tom')
